// // cpp version

// #include <iostream>
// #include <stdlib.h>

// using namespace std;

// class Node{
// public:   
//     int data;
//     Node* next;

//     Node(int data){
//         this->next = nullptr;
//         this->data = data;
//     }
// };

// class SingleList{
// private:
//     Node* head;
// public:
//     SingleList(){
//         head = nullptr;
//     }

//     ~SingleList(){
//         Node *current = head;
//         Node* next = nullptr;
    
//         while(current != nullptr){
//             current = current->next;
//             delete current;
//             current = next;
//         }
//     }

//     bool isEmpty(){
//         return head == nullptr;
//     }

//     void insertAtHead(int data){
//         Node* newNode = new Node(data);
//         if(isEmpty()){
//             head = newNode;
//         }else{
//             newNode->next = head;
//             head = newNode;
//         }
//     }


//     void insertAtTail(int data){
//         Node* newNode = new Node(data);
//         if(isEmpty()){
//             head = newNode;
//             return;
//         } 
//         Node* current = head;
//         while(current->next != nullptr){
//             current = current ->next;
//         }
//         current->next =  newNode;
//     }

//     void insertAtPosition(int data,int position){
//         if(position < 0){
//             cout << " fuck off bitch" << endl;
//             return;
//         }
//         if (position == 0){
//             insertAtHead(data);
//             return;
//         }

//         Node* newNode = new Node(data);
//         Node* current = head;
//         Node* previous = nullptr;
//         int count = 0;

//         while(current != nullptr && count < position){
//             previous = current;
//             current = current->next;
//             count++;
//         }

//         previous->next = newNode;
//         newNode->next = current;
//     }

//     void deleteNode(int data){
//         if(isEmpty()){
//             cout << "link list is empty" << endl;
//             return;
//         }
//         if(head->data == data){
//             Node* temp = head;
//             head = head->next;
//             delete temp;
//             return;
//         }
//         Node * current = head;
//         Node* previous = nullptr;

//         while(current != nullptr && current->data != data){
//             previous = current;
//             current = current ->next;
//         }

//         if(current != nullptr){
//             previous -> next = current -> next;
//             delete current;
//         }else{
//             cout << "elements is not exist"<<endl;
//         }

//     }

//     void display(){
//         if(isEmpty()){
//             cout << "Link List is Empty" <<endl;
//             return;
//         }
//         Node *current = head;
//         while(current ->next != nullptr){
//             cout << current->data << " -> ";
//             current = current->next;
//         }
//         cout <<"nullptr"<<endl;
//     }
// };

// int main(){
//     SingleList l;
//     l.insertAtHead(1);
//     l.insertAtHead(3);
//     l.insertAtHead(5);
//     l.display();
//     l.deleteNode(3);
//     l.display();
//     l.insertAtTail(10);
//     l.insertAtTail(50);
//     l.display();
 
//     return 0;
// }


////c version

// #include <cstdio>
// #include <stdlib.h>
// #include <stdbool.h>

// typedef struct Node{
//     int data;
//     Node* next;
// }Node;

// typedef struct SingleList{
//     Node* head;
// }SingleList;

// SingleList* createList(){
//     SingleList *list = (SingleList*)malloc(sizeof(SingleList));
//     if(list == NULL){
//         printf("error segmentation!");
//         exit(1);
//     }
//     list->head = NULL;
//     return list;
// }

// bool isEmpty(SingleList* list){
//     return list->head == NULL;
// }

// Node* createNode(int data){
//     Node* newNode = (Node*)malloc(sizeof(Node));
//     if(newNode == NULL){
//         printf("error Node Segmentation");
//         exit(1);
//     }
//     newNode->data = data;
//     newNode->next = NULL;
//     return newNode;
// }

// void insertAtHead(SingleList* list,int data){
//     Node* newNode = createNode(data);
//     if(isEmpty(list)){
//         list->head = newNode;
//         return;
//     }else{
//         newNode ->next = list -> head;
//         list -> head = newNode;
//     }
// }

// void insertAtTail(SingleList* list,int data){
//     Node* newNode = createNode(data);
//     if(isEmpty(list)){
//         list->head = newNode;
//         return;
//     }
//     Node* current = list->head;
//     while(current->next != NULL){
//         current = current->next;
//     }
//     current->next = newNode;
// }

// void insertAtPosition(SingleList* list,int data,int position){
//     if(position < 0){
//         printf("position is not valid");
//         return;
//     }
//     if(position == 0){
//         insertAtHead(list,data);
//         return;
//     }
//     Node* newNode = createNode(data);
//     Node* current = list->head;
//     Node* previous = NULL;
//     int count = 0;
//     while(current != NULL && count < position){
//         previous = current;
//         current = current->next;
//         count++;
//     }
//     previous->next = newNode;
//     newNode->next = current;
// }

// void deleteNode(SingleList* list,int data){
//     if(isEmpty(list)){
//         printf("LIST IS EMPTY\n");
//         return;
//     }

//     if(list->head->data == data){
//         Node* temp = list->head;
//         list->head = list->head->next;
//         free(temp);
//         return;
//     }
//     Node* current = list->head;
//     Node* previous = NULL;

//     while(current != NULL && current->data != data){
//         previous = current;
//         current = current->next;
//     }
//     if(current != NULL){
//         previous->next = current->next;
//         free(current);
//     }
//     else{
//         printf("elements is not exist\n");
//     }

// }

// void display(SingleList *list){
//     if(isEmpty(list)){
//         printf("list is empty");
//         return;
//     }
//     Node* current = list->head;
//     while(current != NULL){
//         printf("%d -> ",current->data);
//         current = current->next;
//     }
//     printf("null\n");
// }


// bool search(SingleList *list,int data){
//     if(isEmpty(list)){
//         return false;
//     }
//     Node* current = list->head;
//     while(current != NULL){
//         if(current -> data == data){
//             return true;
//         }
//         current = current->next;
//     }
// return false;
// }

// int main(){
//     SingleList *l = createList();
//     insertAtHead(l,20);
//     insertAtHead(l,10);
//     insertAtHead(l,30);
//     display(l);
//     insertAtTail(l,50);
//     display(l);
//     deleteNode(l,10);
//     display(l);
//     return 0;
// }